{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e71caf17-6e95-45ec-b839-edb6b2384a47",
   "metadata": {},
   "source": [
    "# Microsoft SQL Server\n",
    "\n",
    "In this tutorial, we'll see how to query Microsoft SQL Server from Jupyter. Optionally, you can spin up a testing server.\n",
    "\n",
    "```{tip}\n",
    "If you encounter issues, feel free to join our [community](https://ploomber.io/community) and we'll be happy to help!\n",
    "```\n",
    "\n",
    "## Pre-requisites\n",
    "\n",
    "The first step is to install the [ODBC driver for SQL Server](https://learn.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server?view=sql-server-ver16).\n",
    "\n",
    "- Instructions for [Linux](https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16&tabs=alpine18-install%2Calpine17-install%2Cdebian8-install%2Credhat7-13-install%2Crhel7-offline)\n",
    "- Instructions for [Mac](https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16)\n",
    "\n",
    "For example, if you're on a Mac, you can install the driver with `brew`:\n",
    "\n",
    "```sh\n",
    "/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)\"\n",
    "brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release\n",
    "brew update\n",
    "HOMEBREW_ACCEPT_EULA=Y brew install msodbcsql18 mssql-tools18\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "459d2fb2-82e8-4fff-84b7-f303f4afb4d5",
   "metadata": {},
   "source": [
    "## Start Microsoft SQL Server instance\n",
    "\n",
    "If you don't have a SQL Server running or you want to spin up one for testing, you can do it with the official [Docker image](https://hub.docker.com/_/microsoft-mssql-server).\n",
    "\n",
    "```{important}\n",
    "If you're on a Mac with Apple Silicon (e.g., M1 processor), ensure you're running the latest Docker Desktop version. More info [here](https://bornsql.ca/blog/you-can-run-a-sql-server-docker-container-on-apple-m1-and-m2-silicon/).\n",
    "```\n",
    "\n",
    "\n",
    "To start the server:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "332eec37-b2b2-4a3b-98ec-138361752f6e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "00721df70ea8d5f91c792a84f28f4e0fc6c0ff53f1f4d04cb6911a3a4714deba\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker run -e \"ACCEPT_EULA=Y\" \\\n",
    "    -e \"MSSQL_SA_PASSWORD=MyPassword!\" \\\n",
    "    -p 1433:1433 \\\n",
    "    -d mcr.microsoft.com/mssql/server:2022-latest"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d18492d-e58c-4117-ac5d-602bc7e6445c",
   "metadata": {},
   "source": [
    "```{important}\n",
    "Ensure you set a strong password, otherwise the container will shut down silently!\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f420cee-848e-443e-997e-a6066d5fe704",
   "metadata": {},
   "source": [
    "Ensure that your container is running (run the command a few seconds after running the previous one to ensure it dind't shut down silently):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4cf0cbb5-a120-4b5c-8a49-8484ba5c01fa",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker ps"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a8cc1b60-5d0e-45f6-bb8c-b68952a39f62",
   "metadata": {},
   "source": [
    "If you have issues with the previous command, you can try with SQL Edge:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "83bff03a-cae7-4775-a2b6-d85ceb0ce440",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fabfc30490a17dc0a48313c35289218ff563070b11622bc43f07e82080b2a201\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker run -e \"ACCEPT_EULA=1\" -e \"MSSQL_SA_PASSWORD=MyPassword!\" \\\n",
    "    -e \"MSSQL_PID=Developer\" -e \"MSSQL_USER=sa\" \\\n",
    "    -p 1433:1433 -d --name=sql mcr.microsoft.com/azure-sql-edge"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "489d3952-e5a8-4c11-9341-b06fef290d4d",
   "metadata": {},
   "source": [
    "Ensure the server is running (wait for a few seconds before running it):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f8406efe-2939-4511-b107-daff097f3d54",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                              NAMES\n",
      "fabfc30490a1   mcr.microsoft.com/azure-sql-edge   \"/opt/mssql/bin/perm…\"   5 seconds ago   Up 4 seconds   1401/tcp, 0.0.0.0:1433->1433/tcp   sql\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker ps"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41ed6732-6bda-4417-ae4e-8bc964196c8f",
   "metadata": {},
   "source": [
    "## Installing `pyodbc`\n",
    "\n",
    "\n",
    "`pyodbc` will allow us to connect to SQL Server. If you're on macOS or Linux, you need to install unixODBC. Note that when installing the ODBC driver on macOS using `brew`, unixODBC is also installed.\n",
    "\n",
    "\n",
    "Install `pyodbc` with:\n",
    "\n",
    "```sh\n",
    "pip install pyodbc\n",
    "```\n",
    "\n",
    "```{note}\n",
    "If you're on a Mac with Apple Silicon (e.g., M1 processor), you might encounter issues, if so, try thi:\n",
    "\n",
    "~~~sh\n",
    "pip install pyodbc==4.0.34\n",
    "~~~\n",
    "```\n",
    "\n",
    "Verify a successful installation with:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "27a84060-f8f1-406c-b206-898c4975809f",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import pyodbc"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c2fe1cf-cedc-48ea-a420-36c5c0c24980",
   "metadata": {},
   "source": [
    "Verify that `pyodbc` is able to findn the SQL Server driver:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c7d03c98-9cc3-4c56-a349-0e4f146115d9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['ODBC Driver 18 for SQL Server']"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pyodbc.drivers()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45386e02-c70a-44a0-9635-55e1bcdbdfc7",
   "metadata": {},
   "source": [
    "```{tip}\n",
    "If the driver doesn't appear, uninstalling `pyodbc` and re-installing it again might fix the problem.\n",
    "\n",
    "If you're on a Mac with Apple Silicon, ensure you installed `pyodbc` with `pip`, since `conda` might lead to issues.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ad9f206-5dee-41ec-97a3-8b2622b6b433",
   "metadata": {},
   "source": [
    "## Starting the connection\n",
    "\n",
    "To start the connection, execute the following, change the values to match your SQL Server's configurationo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b2f987d7-c60b-480c-b31c-cd2f6562c9b8",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from sqlalchemy import create_engine\n",
    "from sqlalchemy.engine import URL\n",
    "\n",
    "connection_url = URL.create(\n",
    "    \"mssql+pyodbc\",\n",
    "    username=\"sa\",\n",
    "    password=\"MyPassword!\",\n",
    "    host=\"localhost\",\n",
    "    port=1433,\n",
    "    database=\"master\",\n",
    "    query={\n",
    "        \"driver\": \"ODBC Driver 18 for SQL Server\",\n",
    "        \"Encrypt\": \"yes\",\n",
    "        \"TrustServerCertificate\": \"yes\",\n",
    "    },\n",
    ")\n",
    "engine = create_engine(connection_url)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f45a6f0-a9e3-4282-843f-44169b45e4c2",
   "metadata": {
    "user_expressions": []
   },
   "source": [
    "```{note}\n",
    "If using `pytds`, the `autocommit` feature is disabled since it's not compatible with JupySQL.\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "354906eb-5b76-44dc-9568-c7cda37ccfbc",
   "metadata": {},
   "source": [
    "Install, load the Jupyter extension and start the connection:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d87fd635-8914-4e4e-9461-405f5ec7d581",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install jupysql --quiet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f62bf48d-3e7b-4d5f-99b5-4d48fce98dfc",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Found pyproject.toml from &#x27;/Users/eduardo/dev/jupysql&#x27;</span>"
      ],
      "text/plain": [
       "Found pyproject.toml from '/Users/eduardo/dev/jupysql'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%load_ext sql\n",
    "%sql engine"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c92746b7-85d1-421b-9e70-fd7c8e4930d6",
   "metadata": {},
   "source": [
    "```{note}\n",
    "\n",
    "If you see the following error:\n",
    "\n",
    "~~~\n",
    "InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found and no default driver specified (0) (SQLDriverConnect)')\n",
    "(Background on this error at: https://sqlalche.me/e/14/rvf5)\n",
    "~~~\n",
    "\n",
    "It might be that you're missing the SQL Server ODBC driver or that `pyodbc` cannot find it.\n",
    "\n",
    "```\n",
    "\n",
    "\n",
    "## Load sample data\n",
    "\n",
    "Let's upload some sample data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "aea381e9-9c61-4c15-bd09-aecb87a52e74",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1369769, 19)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_parquet(\n",
    "    \"https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2021-01.parquet\"\n",
    ")\n",
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "f1b4ce63-5a6c-4887-91d8-7457f08b53ed",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "56"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sample(100_000).to_sql(\n",
    "    name=\"taxi\", con=engine, chunksize=100_000, if_exists=\"replace\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e6183c7",
   "metadata": {},
   "source": [
    "## Query"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ee94760-27bb-40db-9bc7-e7d5a9ec585b",
   "metadata": {},
   "source": [
    "Query the new table:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "b4dfc187-015f-4394-b3d9-f9fc0a79c4e5",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th></th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>100000</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>\n",
       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
      ],
      "text/plain": [
       "+--------+\n",
       "|        |\n",
       "+--------+\n",
       "| 100000 |\n",
       "+--------+"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "select COUNT(*) FROM taxi"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e134d0ed-5501-4425-bd97-302b07062d57",
   "metadata": {},
   "source": [
    "List the tables in the database:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "cad65f83-48d5-415e-aaeb-8fa7b4e2256c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>Name</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>MSreplication_options</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>spt_fallback_db</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>spt_fallback_dev</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>spt_fallback_usg</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>spt_monitor</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>taxi</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-----------------------+\n",
       "|          Name         |\n",
       "+-----------------------+\n",
       "| MSreplication_options |\n",
       "|    spt_fallback_db    |\n",
       "|    spt_fallback_dev   |\n",
       "|    spt_fallback_usg   |\n",
       "|      spt_monitor      |\n",
       "|          taxi         |\n",
       "+-----------------------+"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd tables"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7af2e627-9089-4381-9543-d923832a2dab",
   "metadata": {},
   "source": [
    "List columns in the taxi table:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "aa32ce39-8314-4836-919b-0cc9259c44d5",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th>name</th>\n",
       "            <th>type</th>\n",
       "            <th>nullable</th>\n",
       "            <th>default</th>\n",
       "            <th>autoincrement</th>\n",
       "            <th>comment</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>index</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>VendorID</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_pickup_datetime</td>\n",
       "            <td>DATETIME</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tpep_dropoff_datetime</td>\n",
       "            <td>DATETIME</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>passenger_count</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>trip_distance</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>RatecodeID</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>store_and_fwd_flag</td>\n",
       "            <td>VARCHAR COLLATE &quot;SQL_Latin1_General_CP1_CI_AS&quot;</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>PULocationID</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>DOLocationID</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>payment_type</td>\n",
       "            <td>BIGINT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>fare_amount</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>extra</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>mta_tax</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tip_amount</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>tolls_amount</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>improvement_surcharge</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>total_amount</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>congestion_surcharge</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "        <tr>\n",
       "            <td>airport_fee</td>\n",
       "            <td>FLOAT</td>\n",
       "            <td>True</td>\n",
       "            <td>None</td>\n",
       "            <td>False</td>\n",
       "            <td>None</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "+-----------------------+------------------------------------------------+----------+---------+---------------+---------+\n",
       "|          name         |                      type                      | nullable | default | autoincrement | comment |\n",
       "+-----------------------+------------------------------------------------+----------+---------+---------------+---------+\n",
       "|         index         |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
       "|        VendorID       |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
       "|  tpep_pickup_datetime |                    DATETIME                    |   True   |   None  |     False     |   None  |\n",
       "| tpep_dropoff_datetime |                    DATETIME                    |   True   |   None  |     False     |   None  |\n",
       "|    passenger_count    |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|     trip_distance     |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|       RatecodeID      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|   store_and_fwd_flag  | VARCHAR COLLATE \"SQL_Latin1_General_CP1_CI_AS\" |   True   |   None  |     False     |   None  |\n",
       "|      PULocationID     |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
       "|      DOLocationID     |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
       "|      payment_type     |                     BIGINT                     |   True   |   None  |     False     |   None  |\n",
       "|      fare_amount      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|         extra         |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|        mta_tax        |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|       tip_amount      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|      tolls_amount     |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "| improvement_surcharge |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|      total_amount     |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|  congestion_surcharge |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "|      airport_fee      |                     FLOAT                      |   True   |   None  |     False     |   None  |\n",
       "+-----------------------+------------------------------------------------+----------+---------+---------------+---------+"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%sqlcmd columns --table taxi"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a3316e7-8ba6-46ac-a46b-6fb3a0d4776c",
   "metadata": {},
   "source": [
    "## Parametrize queries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "91e78151-7ae2-498d-8a19-3de0ee4781c7",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "threshold = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "7947bc67-9170-4808-835d-b0bf82229022",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th></th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>94705</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>\n",
       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
      ],
      "text/plain": [
       "+-------+\n",
       "|       |\n",
       "+-------+\n",
       "| 94705 |\n",
       "+-------+"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM taxi\n",
    "WHERE trip_distance < {{threshold}}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "73acb44a-cb1a-44ab-bfd6-42309fc1defd",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "threshold = 0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d88db9b4-1efe-4b7b-b8be-f94949b3ce69",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th></th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>5326</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>\n",
       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
      ],
      "text/plain": [
       "+------+\n",
       "|      |\n",
       "+------+\n",
       "| 5326 |\n",
       "+------+"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql\n",
    "SELECT COUNT(*) FROM taxi\n",
    "WHERE trip_distance < {{threshold}}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bfb89b06-c5c1-4ad3-bc4f-2f12071c559c",
   "metadata": {},
   "source": [
    "## CTEs\n",
    "\n",
    "You can break down queries into multiple cells, JupySQL will build a CTE for you:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "2519b021-90bb-42f4-b637-7dc4e214eaad",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Skipping execution...</span>"
      ],
      "text/plain": [
       "Skipping execution..."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%sql --save many_passengers --no-execute\n",
    "SELECT *\n",
    "FROM taxi\n",
    "WHERE passenger_count > 3\n",
    "-- remove top 1% outliers for better visualization\n",
    "AND trip_distance < 18.93"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "856de699-a460-43de-8ea2-d50ea4459340",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Running query in &#x27;mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&amp;TrustServerCertificate=yes&amp;driver=ODBC+Driver+18+for+SQL+Server&#x27;</span>"
      ],
      "text/plain": [
       "Running query in 'mssql+pyodbc://sa:***@localhost:1433/master?Encrypt=yes&TrustServerCertificate=yes&driver=ODBC+Driver+18+for+SQL+Server'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <thead>\n",
       "        <tr>\n",
       "            <th></th>\n",
       "            <th>_1</th>\n",
       "            <th>_2</th>\n",
       "        </tr>\n",
       "    </thead>\n",
       "    <tbody>\n",
       "        <tr>\n",
       "            <td>0.0</td>\n",
       "            <td>2.5377720207253898</td>\n",
       "            <td>18.83</td>\n",
       "        </tr>\n",
       "    </tbody>\n",
       "</table>\n",
       "<span style='font-style:italic;font-size:11px'><code>ResultSet</code> : to convert to pandas, call <a href='https://jupysql.ploomber.io/en/latest/integrations/pandas.html'><code>.DataFrame()</code></a> or to polars, call <a href='https://jupysql.ploomber.io/en/latest/integrations/polars.html'><code>.PolarsDataFrame()</code></a></span><br>"
      ],
      "text/plain": [
       "+-----+--------------------+-------+\n",
       "|     |         _1         |   _2  |\n",
       "+-----+--------------------+-------+\n",
       "| 0.0 | 2.5377720207253898 | 18.83 |\n",
       "+-----+--------------------+-------+"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%sql --save trip_stats --with many_passengers\n",
    "SELECT MIN(trip_distance), AVG(trip_distance), MAX(trip_distance)\n",
    "FROM many_passengers"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c315112-77c5-4a4c-ab19-55f80f43c88d",
   "metadata": {},
   "source": [
    "This is what JupySQL executes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "83aa9bcb-dd70-47a0-ae33-566b108dea1a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WITH many_passengers AS (\n",
      "SELECT *\n",
      "FROM taxi\n",
      "WHERE passenger_count > 3\n",
      "-- remove top 1% outliers for better visualization\n",
      "AND trip_distance < 18.93)\n",
      "SELECT MIN(trip_distance), AVG(trip_distance), MAX(trip_distance)\n",
      "FROM many_passengers\n"
     ]
    }
   ],
   "source": [
    "query = %sqlcmd snippets trip_stats\n",
    "print(query)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e6388a7-e524-4c94-8b4d-6bac99622790",
   "metadata": {},
   "source": [
    "## Plotting\n",
    "\n",
    "### Boxplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "8785696d-5d86-4d22-b8a4-ac2a5d089e4c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Plotting using saved snippet : many_passengers</span>"
      ],
      "text/plain": [
       "Plotting using saved snippet : many_passengers"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': \"'trip_distance' from 'many_passengers'\"}, ylabel='trip_distance'>"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot boxplot --table many_passengers --column trip_distance"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4829b0be-cdb3-4185-b495-84cfa58c0d86",
   "metadata": {},
   "source": [
    "### Bar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "03306421-1ae0-4b89-a524-f6d4b0a79d8a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Removing NULLs, if there exists any from vendorid</span>"
      ],
      "text/plain": [
       "Removing NULLs, if there exists any from vendorid"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'taxi'}, xlabel='vendorid', ylabel='Count'>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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rznOnDmjoUOHyuFwqFGjRho5cqTOnz/vVfPxxx/rnnvuUWhoqKKjozV37tyrelm9erXatWun0NBQderUSe+88871OWkAAFDn+DQ0nT17Vr1791ZwcLA2bNigf/zjH3rllVd02223mTVz587Va6+9piVLlmjXrl2qX7++EhMTdfHiRbNm6NChOnjwoDZt2qT169dr+/btGjVqlDnu8XjUr18/tWrVSrm5uXrppZc0c+ZMLV261KzZsWOHHn30UY0cOVIffvihBgwYoAEDBujAgQM35mIAAAC/ZjMMw/DVwadOnaoPPvhA77//frXjhmEoKipKzzzzjJ599llJUklJiSIiIpSenq4hQ4bo0KFDio2N1Z49e9S9e3dJUlZWlh544AH985//VFRUlBYvXqxf//rXcrvdstvt5rHXrFmj/Px8SdLgwYNVWlqq9evXm8fv1auXunbtqiVLlnznuXg8HjmdTpWUlMjhcHyv64LaETM109ct+MyxF5N83QIA1AnX8vvbp3ea1q5dq+7du+vnP/+5wsPDddddd+mNN94wx48ePSq3262EhARzn9PpVHx8vHJyciRJOTk5atSokRmYJCkhIUEBAQHatWuXWXPvvfeagUmSEhMTVVBQoLNnz5o1Vx6nqqbqOF9XVlYmj8fjtQEAgJuXT0PTZ599psWLF+uOO+7Qxo0bNWbMGD399NNavny5JMntdkuSIiIivN4XERFhjrndboWHh3uNBwUFqXHjxl411c1x5TG+qaZq/OvmzJkjp9NpbtHR0dd8/gAAoO7waWiqrKxUt27d9MILL+iuu+7SqFGj9NRTT1n6OMzXpk2bppKSEnM7fvy4r1sCAADXkU9DU/PmzRUbG+u1r3379iosLJQkRUZGSpKKioq8aoqKisyxyMhInTp1ymv88uXLOnPmjFdNdXNceYxvqqka/7qQkBA5HA6vDQAA3Lx8Gpp69+6tgoICr32ffPKJWrVqJUlq3bq1IiMjlZ2dbY57PB7t2rVLLpdLkuRyuVRcXKzc3FyzZvPmzaqsrFR8fLxZs337dl26dMms2bRpk9q2bWt+U8/lcnkdp6qm6jgAAODW5tPQNHHiRO3cuVMvvPCCjhw5ooyMDC1dulQpKSmSJJvNpgkTJuj555/X2rVrtX//fj3++OOKiorSgAEDJP3rztT999+vp556Srt379YHH3yg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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot bar --table taxi --column vendorid"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dd9005c9-8f88-4448-bc79-0916d012c42f",
   "metadata": {},
   "source": [
    "### Pie"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "8064ebec-e294-4019-a9c7-e1af48a1eb81",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<span style=\"None\">Removing NULLs, if there exists any from vendorid</span>"
      ],
      "text/plain": [
       "Removing NULLs, if there exists any from vendorid"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'taxi'}>"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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5Dlk+IcEpUSnIDMpE5mJwW/dWnXDJamXwO3Q79VlZD0cBTIEf8CPY1XHtKEoqCpAUW0RimqKUFxbrJs300XZo5DqTkWXhC7aAHRN6orMxEzeX4gMgaNAplBWX4bi2mIU1RShqLYIp2pOobi2GB6vB7WNtahurEZtYy1qGmtQ76uHN+CF1+/93k3/bIoNLpsLTrsTLpsLLnvwm9PmhMvuQlJUElLdqUhxp6C1uzVS3ana/051pyLBlSD0d4AoNDgKZGlef3AcbIoNLrsLDhtvHEzWxlEgIiINb4pCREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNAREQajgIREWk4CkREpOEoEBGRhqNARESa/w/5aR/aWTcIZQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%sqlplot pie --table taxi --column vendorid"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c057eda2-2f9c-4048-a071-ae8592e03cf5",
   "metadata": {},
   "source": [
    "## Clean up"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "755ca85e-5015-49bb-b52d-7fd14bb85d0e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                              NAMES\n",
      "fabfc30490a1   mcr.microsoft.com/azure-sql-edge   \"/opt/mssql/bin/perm…\"   7 minutes ago   Up 7 minutes   1401/tcp, 0.0.0.0:1433->1433/tcp   sql\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker container ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "66c440de-78ac-4fa2-a6e0-692588ca6be0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sql\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker container stop sql"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "6eeb8cb5-18ce-48e8-8609-53db1ad78026",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sql\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker container rm sql"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "6fb190ad-cb88-4fed-a650-0e568bed3330",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES\n"
     ]
    }
   ],
   "source": [
    "%%bash\n",
    "docker container ls"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "myst": {
   "html_meta": {
    "description lang=en": "Query a Microsoft SQL Server from Jupyter via JupySQL",
    "keywords": "jupyter, sql, jupysql, mssql, sql server",
    "property=og:locale": "en_US"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
